package cn.song.freight.controller;

import cn.song.freight.annotation.OperationLog;
import cn.song.freight.domain.dto.*;
import cn.song.freight.domain.result.R;
import cn.song.freight.domain.vo.WeightSegmentRuleVO;
import cn.song.freight.enums.ModuleType;
import cn.song.freight.enums.OperationType;
import cn.song.freight.service.WeightSegmentRuleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

/**
 * 重量区间规则管理控制器
 * <pre>
 * 该控制器负责管理运费策略中的重量区间规则配置。
 * 重量区间规则允许为不同重量段设置差异化的运费标准，
 * 实现更精细化的运费计算。
 *
 * 核心功能：
 * - 创建新的重量区间规则
 * - 修改现有重量区间规则
 * - 删除不需要的重量区间规则
 * - 按策略查询重量区间规则列表
 *
 * 业务场景：
 * - 阶梯定价：不同重量区间对应不同单价
 * - 批量优惠：大件包裹享受更优惠的单价
 * - 特殊商品：某些商品有特定的重量计费规则
 *
 * 数据验证：
 * - 重量区间不能重叠
 * - 上限重量必须大于下限重量
 * - 费率必须为正数
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-23
 */
@Api(tags = "重量区间规则管理")
@Validated
@RequestMapping("/weight-segment-rule")
@RestController
@RequiredArgsConstructor
public class WeightSegmentRuleController {

    /**
     * 重量区间规则服务，处理具体的业务逻辑
     */
    private final WeightSegmentRuleService weightSegmentRuleService;

    /**
     * 新增重量区间规则
     * <pre>
     * 为指定的运费策略添加新的重量区间规则。
     * 系统会验证重量区间的合理性和唯一性。
     *
     * @deprecated 使用 V3统一配置保存接口
     * @see cn.song.freight.controller.StrategyAreaPricingController#saveAllConfigV2(StrategyConfigUnifiedSaveRequestDTO requestDTO)
     * @param ruleDTO 重量区间规则数据传输对象
     * @return 操作结果，包含创建的规则信息
     */
    @PostMapping("/add")
    @ApiOperation("新增重量区间规则")
    @OperationLog(
            moduleType = ModuleType.WEIGHT_SEGMENT_RULE,
            operationType = OperationType.INSERT,
            description = "新增重量区间规则",
            businessNameField = "ruleName",
            businessIdField = "strategyId"
    )
    public R<WeightSegmentRuleDTO> add(@RequestBody @Validated WeightSegmentRuleDTO ruleDTO) {
        return weightSegmentRuleService.add(ruleDTO);
    }

    /**
     * 删除重量区间规则
     * <pre>
     * 根据规则ID删除指定的重量区间规则。
     * 删除前会检查是否有相关的映射关系依赖此规则。
     *
     * @deprecated 使用 V3统一配置保存接口
     * @see cn.song.freight.controller.StrategyAreaPricingController#saveAllConfigV2(StrategyConfigUnifiedSaveRequestDTO requestDTO)
     * @param deleteDTO 通用ID操作数据传输对象
     * @return 操作结果
     */
    @PostMapping("/delete")
    @ApiOperation("删除重量区间规则")
    @OperationLog(
            moduleType = ModuleType.WEIGHT_SEGMENT_RULE,
            operationType = OperationType.DELETE,
            description = "删除重量区间规则",
            businessIdField = "id"
    )
    public R<Void> delete(@Valid @RequestBody BaseIdDTO deleteDTO) {
        return weightSegmentRuleService.delete(deleteDTO.getId());
    }

    /**
     * 修改重量区间规则
     * <pre>
     * 更新现有重量区间规则的配置信息。
     * 修改时会重新验证规则的合理性。
     *
     * @deprecated 使用 V3统一配置保存接口
     * @see cn.song.freight.controller.StrategyAreaPricingController#saveAllConfigV2(StrategyConfigUnifiedSaveRequestDTO requestDTO)
     * @param ruleDTO 包含更新信息的重量区间规则数据传输对象
     * @return 操作结果，包含更新后的规则信息
     */
    @PostMapping("/update")
    @ApiOperation("修改重量区间规则")
    @OperationLog(
            moduleType = ModuleType.WEIGHT_SEGMENT_RULE,
            operationType = OperationType.UPDATE,
            description = "修改重量区间规则",
            businessNameField = "ruleName",
            businessIdField = "id"
    )
    public R<WeightSegmentRuleDTO> update(@RequestBody @Validated WeightSegmentRuleDTO ruleDTO) {
        return weightSegmentRuleService.update(ruleDTO);
    }

    /**
     * 查询重量区间规则列表
     * <pre>
     * 根据策略ID查询该策略下的所有重量区间规则，
     * 按区间序号排序返回。
     *
     * @deprecated 使用查询策略区域定价配置列表接口
     * @see StrategyAreaPricingController#list(StrategyAreaPricingQueryDTO queryDTO)
     * @param queryDTO 通用策略查询数据传输对象
     * @return 重量区间规则列表
     */
    @PostMapping("/list")
    @ApiOperation("查询重量区间规则列表")
    public R<List<WeightSegmentRuleVO>> listByStrategyId(@Valid @RequestBody BaseStrategyQueryDTO queryDTO) {
        return R.success(weightSegmentRuleService.listByStrategyId(queryDTO.getStrategyId()));
    }
}
